30. Programando con GNU/Linux.



30.1. Tus primeros pasos: KTurtle.

30.1.1. Definición. Características.

KTurtle es un entorno de programación diseñado específicamente para enseñar a programar, por lo tanto tiene como objetivos conseguir que la programación sea lo más sencilla y amena posible. Está basada en Logo y las direcciones a tener en cuenta son la página oficial http://edu.kde.org/kturtle/ y su manual http://docs.kde.org/development/en/kdeedu/kturtle/.

Forma parte del proyecto educativo de KDE, por lo tanto es una aplicación para GNU/Linux.


30.1.2. Instalación.

Puedes instalarlo de forma independiente con el paquete kturtle o dentro del metapaquete kde4edu que engloba todas las aplicaciones que forman parte del citado proyecto educativo de KDE.


30.1.3 Creación de una flor.

1. Ejecútalo desde Aplicaciones, Educación, KTurtle o escribe en la consola kturtle.

2. Busquemos la flor, está dentro de una batería de ejemplos que incluye el programa. Navega por Archivo, Abrir ejemplos…, selecciona flower.logo. Observa que los ficheros de KTurtle tienen extensión .logo.

3. Ejecútalo desde Archivo, Ejecutar comandos o F5.

4. Observa dos ejemplos, uno a la izquierda curly.logo y otro a la derecha, nuestra flor. A la izquierda está el código, a la derecha el resultado.

Fíjate qué fácil es dibujar un cuadrado, lo encontrarás en el ejemplo square.log:

repeat 4 [ “repite 4 veces, una por cada lado”

forward 100, “camina 100 pasos, que será la longitud de cada lado”

turnleft 90 “gira a la izquierda 90 grados”

]


30.2. Programando C/C++ con la vieja escuela: gcc

30.2.1. Definición. Características. Direcciones interesantes.

Gcc es el compilador GNU estándar y libre para C en sistemas UNIX/Linux. Páginas de visita obligada son la página oficial http://gcc.gnu.org/, así como un manual bastante reciente que puedes encontrar en http://gcc.gnu.org/onlinedocs/gcc-4.2.1/gcc/.


30.2.2. Compilación y ejecución de un programa que calcula el factorial de un número en GNU/Linux.

Lo primero que debes hacer es instalar el paquete build-essential. Luego editas el fichero factorial.c y escribes el código que te mostramos en la ilustración. Ahora, compilas con la orden: gcc -o factorial.o (el nombre del ejecutable resultante) factorial.c (archivo fuente), finalmente ejecutas con: “. /factorial.o


Fíjate, en sistemas Windows para ejecutar el programa que hemos creado, basta con escribir la orden:

Nombredeprograma.exe

En cambio en GNU/Linux, primero tendremos que dar permisos de ejecución sobre el archivo creado y posteriormente ejecutar la orden:

./Nombredelprograma

30.2.3. Compilando varios archivos fuentes.

Cuando nuestro código crece, no es una buena idea tener todas las funciones y el cuerpo del programa en un único fichero principal o main. Así debe considerarse por ejemplo, agrupar las funciones en ficheros separados del programa main principal.

Mira a modo de ilustración el siguiente ejemplo. Separamos la función factorial en un fichero fuente llamado factorial.c, con su fichero de cabecera, factorial.h. Ambos ficheros están editados en la parte superior de la ilustración, a la izquierda factorial.h donde encontramos el prototipo de la función que más tarde implementaremos en factorial.c a su derecha.

El archivo main.c es el que tiene la función principal, main de entrada y salida del programa, obsérvalo en la ventana central de la figura. También debes fijarte en que precisamos añadir un “include” al fichero factorial.h para poder utilizar la función factorial. Observa que este modo de programación es más estructurado y organizado, lo cual nos será de gran utilidad, sobre todo cuando el código no se reduce a una función huérfana (factorial) y una llamada a ésta.

Por último en la ventana más inferior, compilamos ambos fuentes con:

gcc -o main.o factorial.c main.c

Y ejecutamos el resultado con:

./main.o

30.2.4. Creando librerías.

Profundizando en la programación estructurada, las librerías proporcionan un pasito más, aislando cierta funcionalidad en librerías, conseguimos mayor reusabilidad y mantenibilidad y por tanto lo que todos queremos, mayor productividad, además de un código más seguro y simple. Esta es la razón que hace que las librerías dinámicas DLL (Windows), so (UNIX) estén tan de moda.

Hay dos tipos de librerías, las estáticas y las dinámicas. Las estáticas se incluyen en nuestro programa al compilarlo, hacen al ejecutable “más grande” pero este será más rápido al no tener que buscar las librerías cuando las necesita. Sin embargo, las dinámicas, se enlazan dinámicamente en tiempo de ejecución y no se encuentran contenidas en el ejecutable.

Para crear una librería estática (una explicación mucho más detallada y en profundidad puedes estudiarla en http://www.network-theory.co.uk/docs/gccintro/index.html y http://www.chuidiang.com/clinux/herramientas/librerias.php), seguimos los siguientes pasos:

1. Compilamos los ficheros fuentes por separado, imaginemos por ejemplo que tenemos dos funciones (es_primo, factorial) en sendos ficheros fuentes (primo.c, primo.h, factorial.c, factorial.h). Esto se hace con:

gcc -c -o fuente.o fuente.c

2. Creamos la librería, usamos el comando ar con los parámetros cr, estos parámetros crean la librería si no existe y si ya existe la reemplazan. Posteriormente indicamos el nombre de la librería, miLibreria.a y los ficheros objetos que forman la librería (factorial.o, primo.o).

ar cr miLibreria.a factorial.o primo.o

3. Compilamos nuestra función principal, indicando el nombre de la librería. Observa que suponemos, en aras de una mayor simplicidad, que todos los archivos están en el mismo directorio.

gcc –Wall main.c miLibreria.a –o main.o

4. Ejecutamos el resultado final con

./main.o

Observarás que la última orden gcc tiene la opción Wall, esta opción sirve para indicar al compilador que nos avise cuando haya errores o avisos. Un error impide la ejecución del programa, un aviso nos indica que el compilador ha detectado algo extraño y que puede llevar a una ejecución no deseada de nuestro programa.

Vamos ahora a explicar cómo crear una librería dinámica:

1. Definimos la variable de entorno LD_LIBRARY_PATH que define donde vamos a guardar nuestras librerías dinámicas.

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/joe

2. Compilamos los ficheros fuentes con la opción fPIC que indican que van a ser parte de una librería compartida.

gcc –c –fPIC factorial.c –o factorial.o

gcc –c –fPIC primo.c –o primo.o

3. Creamos la librería dinámica con la instrucción:

gcc -shared -fPIC -o nombreLibreria.so fuente1.o fuente2.o

4. Compilamos y ejecutamos la función principal.

gcc –Wall main.c –o main.o miLibreria.so

./main.o


30.3. Anjuta.

La página oficial de Anjuta es http://www.anjuta.org/ y consta entre otras características de un gestor de proyectos, distintos asistentes para el desarrollo de aplicaciones, un debugger interactivo y un potente editor de código.

La instalación de la aplicación la podemos realizar desde Synaptic, instalando el paqueteanjuta. Una vez instalada se nos ubica dentro de la categoría de Programación.

Al iniciar la aplicación, desde Aplicaciones, Programación, EID Anjuta, vemos como presenta un entorno bastante más amigable que un terminal y desde el cual vamos a poder desarrollar todas las operaciones de compilación, depuración y ejecución.

Para realizar tu primer proyecto debes seguir los siguientes pasos.

1. Crear un proyecto nuevo: Archivo, Nuevo, Projecto o desde el panel central haz clic en el enlace Proyecto.

Tendrás que indicar el tipo de proyecto. Selecciona en la categoría C, Genérico.

Observa que puedes desarrollar aplicaciones de distinto tipo y con diferentes lenguajes de programación (C, C++, Java y Python).

2. En la siguiente pantalla introduces la información básica del proyecto: Nombre del proyecto (miProyecto), Autor (joe), Dirección del correo (pasatelinux@gmail.com), Versión (0.1).

3. En la penúltima pantalla defines las distintas opciones del proyecto: licencia (por defecto GPL), destino (/home/joe/miproyecto), etc. Deja en principio las opciones por defecto.

4. En la última pantalla obtendrás un pequeño resumen sobre tu proyecto. Finaliza el asistente haciendo clic en Aplicar.

En la figura puedes elegir entre el editor Scintilla y GtkSourceview, haz clic en Recordar esta decisión para que no te pregunte de nuevo.

5. Observa cómo nos ha construido un esqueleto de aplicación e incluso algo de código en el directorio src (source, código fuente), main.c (el archivo donde se encuentra la función main de la aplicación) para poder escribir “Programa en Linux”.

6. Ahora le indicamos que automáticamente genere los archivos necesarios, haz clic en el botón Construir proyecto.

Normalmente en la ventana de diálogo que se te muestra dejarás las opciones por defecto. Pulsa Ejecutar. Nos debe indicar en la ventana de Mensajes el siguiente resultado:

Completado correctamente.

Tiempo total empleado: 1 segundos.

7. Ejecutamos el programa: botón Ejecutar, en el menú Ejecutar, Ejecutar o la tecla F3.

30.4. Kdevelop.

30.4.1 Definición. Características. Direcciones interesantes.

KDevelop es otro IDE, es decir, un entorno gráfico para el desarrollo rápido de aplicaciones (RAD): editor de código con características específicas para la programación como tabulación automática y coloreado sintáctico, asistentes para la realización de distintos tipos de proyectos, gestión de proyectos, interfaz gráfico para el compilador gcc, soporte para distintos lenguajes, etc.

Fue fundado en 1998 con la aspiración de permitir construir aplicaciones para el entorno KDE de la forma más sencilla y amigable posible. Su dirección oficial es http://www.kdevelop.org/ y está disponible bajo licencia GPL. También puede resultarte útil la dirección http://www.beginning-kdevelop-programming.co.uk/ donde se trata de introducir a los principiantes en la programación con KDevelop.


30.4.2 Instalación.

La instalación no puede ser más sencilla, basta con instalar desde nuestro gestor de paquetes preferido, Synaptic o Adept, el paquete kdevelop.


30.4.3 Creación de un proyecto visual: un Hola Mundo molón.

Como es de esperar una vez concluida la instalación se nos ubicará en la categoría de Programación, si utilizamos el gestor de ventanas KDE estará en K, Desarrollo, KDevelop, KDevelp: C/C++ IDE para C/C++.

Para desarrollar un proyecto, realiza los siguientes pasos:

1. Crea un nuevo proyecto:Project, New Project. Defines el nombre, tipo y ubicación del proyecto. En el ejemplo seleccionaremos un proyecto en C++, concretamente Simple Hello World program.

2. En la siguiente pantalla rellenamos la información general: Autor, E-mail, Versión (por defecto 0.1), E-mail y Licencia (por defecto, GPL).

3. Acepta en el resto de las pantallas las opciones por defecto: sin control de versiones y sendas plantillas indicando que el código está bajo licencia GNU para los ficheros de cabecera .h y .cpp. Observa que nos crea un esqueleto de aplicación.

4. Sobre dicho esqueleto prueba a escribir las líneas de código que aparecen en la figura inferior.

5. Construye el proyecto: Build, Build Project o la tecla F8. Al ejecutar esta opción KDevelop realizará automáticamente todos los pasos intermedios: compilación, make, etc. Debes obtener en la ventana de mensajes, algo como: **Success** o éxito.

6. Ejecuta dicho proyecto: Build, Execute Program o Mayúsculas y la tecla F9.


30.5. Iniciación a wxWidgets con Code::Blocks.

Code::Blocks es un entorno de desarrollo libre (licencia GPLv3), diseñado para ser extensible, configurable, multiplataforma (corre en Linux, Max y Windows) y tal como puedes leer en inglés en su página Web, http://www.codeblocks.org/, construido para atender las exigencias de los más exigentes,.

En Ubuntu instala los siguientes paquetes: codeblocks codeblocks-contrib gdb automake autoconf libtool libgtk2.0-dev libxmu-dev libxxf86vm-dev libwxbase2.8-dev wx2.8-headers libwxgtk2.8-dev wx-common. Si bien algunos no son estrictamente necesarios, si los encontrarás útiles para depurar, escribir aplicaciones con wxWidgets, etc.

Lo encontrarás en Aplicaciones, Programación, Code::Blocks IDE.

La primera vez que lo lanzas detectará los compiladores que tengas en tu máquina. Selecciona GNU GCC Compiler como el compilador por defecto.

Observa la ventana de la aplicación, encontramos la típica barra de menú, el gestor de proyectos en el panel izquierdo, un panel central donde editaremos el código y una ventana Logs & others en la que visualizaremos los mensajes del compilador, resultados de salida, etc.

Para empezar un proyecto puedes hacer clic en el enlace Create a new project o desde el menú Archivo, New, Project…

Como puedes observar disponemos de numerosos templates o plantillas en función del tipo de proyecto que deseemos implementar.

En nuestro caso, elige el proyecto de wxWidgets: wxWidgets Project y haz clic en Go.

A partir de ahora comienza un asistente relativo al proyecto con wxWidgets. Haz clic en Skip this page next time, para saltarte esta ventana que realmente no aporta nada.

Pulsa Siguiente y en la siguiente ventana del asistente selecciona el proyecto wxWidgets2.8.x tal como se ilustra en la figura.

En la ventana de la derecha indica un título para el proyecto y un directorio para almacenarlo. El nombre del fichero del proyecto será el nombre del proyecto con la extensión .cbp.

A continuación, indica los datos siguientes:

* Author: Nombre del autor.

* Author´s email: E-mail del autor.

* Author’s website: Dirección Web.

En la siguiente pantalla deberemos indicar si queremos una aplicación de tipo Dialog o Frame. Selecciona Frame Based por ser la más general.

Si seleccionas Dialog Based, obtendrás un esqueleto de aplicación que te mostrará al ejecutarlo con Build, Run la siguiente ventana:

Si haces clic en About obtendrás la ventana modal que se muestra en la figura.

Si pulsas en el botón Quit saldrás de la aplicación. En general, el código que escribe Code::Blocks es muy legible y bastante utilizable.

En las siguientes pantallas del asistente, en general podrás dejar las opciones por defecto.

Así te solicita que indiques el compilador deseado, GNU GCC Compiler; deja la configuración por defecto en la siguiente ventana de wxWidgets y acaba pulsando el botón Finalizar.

Si navegas por el gestor de proyectos, en Workspace (espacio de trabajo), MiProyecto, Sources se encuentran los fuentes.

Para compilar el proyecto sigue la secuencia Build, Build o Ctrl, F9. Para ejecutarlo Build, Run o las teclas rápidas Ctrl, F10.

Observa el ejemplo que vamos a realizar. Se trata de un mini editor de textos. Tenemos una barra de menú con las opciones más típicas: Archivo, Edita, Ayuda. Además tenemos un panel central donde se visualizará el fichero y una barra de estado.

Si seleccionamos Archivo, Abrir o Ctrl, O accederemos a una ventana de selección de ficheros.

La ventana titulada Abrir fichero permite seleccionar un fichero.

Al pulsar el botón Abrir dicho fichero se visualizará en el panel central tal como se muestra en la figura adjunta.

También se observa el resultado de seleccionar Archivo, Acerca donde se muestra una ventana con tres botones: Créditos, Licencia y Cerrar que permite acceder a información acerca de los autores, traductores, licencia, etc.

Finalmente, mostramos el cuadro de selección de fuente resultante de seleccionar Edita, Editar la fuente.

Ya hemos visto qué queremos obtener, veamos cómo:

Existen dos clases fundamentales. La primera es MiProyectoApp que hereda de wxApp y modela nuestra aplicación en su conjunto. Observa la cabecera de la aplicación que ha sido creado por Code::Blocks utilizando nuestras indicaciones en el asistente.

/***************************************************************

* Name: MiProyectoApp.h

* Purpose: Defines Application Class

* Author: joe (pasatelinux@gmail.com)

* Created: 2009-05-31

* Copyright: joe (http://quickandhandytips.com)

* License: GPL.

**************************************************************/

#ifndef MIPROYECTOAPP_H

#define MIPROYECTOAPP_H

#include <wx/app.h>

class MiProyectoApp : public wxApp

{

public:

virtual bool OnInit();

};

#endif // MIPROYECTOAPP_H

/***************************************************************

* Name: MiProyectoApp.cpp

* Purpose: Code for Application Class

* Author: joe (pasatelinux@gmail.com)

* Created: 2009-05-31

* Copyright: joe (http://quickandhandytips.com)

* License: GPL.

**************************************************************/

#ifdef WX_PRECOMP

#include "wx_pch.h"

#endif

#ifdef __BORLANDC__

#pragma hdrstop

#endif //__BORLANDC__

#include "MiProyectoApp.h"

#include "MiProyectoMain.h"

#include <wx/panel.h>

IMPLEMENT_APP(MiProyectoApp);

bool MiProyectoApp::OnInit()

{

/* Estas son las líneas más importantes de esta clase, creamos un objeto de tipo MiProyectoFrame. Este último será nuestro objeto encargado de la gestión de la GUI o interfaz de usuario. Nuestra clase MiProyectoFrame heredará de wxFrame que es la clase que modela las ventanas cuyo tamaño y posición pueden (y habitualmente son) cambiadas por el usuario. Típicamente tienen bordes, barra de título y opcionalmente barras de menú y estado.

El título de la ventana principal es “Mi Proyecto con wxWidgets” y debes llamar al método Show para poder visualizarla. */

MiProyectoFrame* frame = new MiProyectoFrame(0L, _("Mi Proyecto con wxWidgets"));

frame->Show();

return true;

}

/* Esta es la segunda clase de nuestro proyecto, MiProyectoFrame se encuentra definida e implementada en los ficheros MiProyectoMain.h y MiProyectoMain.cpp */

/***************************************************************

* Name: MiProyectoMain.h

* Purpose: Defines Application Frame

* Author: joe (pasatelinux@gmail.com)

* Created: 2009-05-31

* Copyright: joe (http://quickandhandytips.com)

* License:

**************************************************************/

#ifndef MIPROYECTOMAIN_H

#define MIPROYECTOMAIN_H

#ifndef WX_PRECOMP

#include <wx/wx.h>

#endif

#include "MiProyectoApp.h"

/* Tal como indicamos nuestra clase hereda de wxFrame*/

class MiProyectoFrame: public wxFrame

{

public:

MiProyectoFrame(wxFrame *frame, const wxString& title);

~MiProyectoFrame();

/* En nuestra ventana debemos definir como atributo público miTextCtrl del tipo wxTextCtrl. Se trata de un control que permite visualizar o editar textos y que puede tener una o varias líneas. Por supuesto con wxWidgets podemos tener muchos más controles: botones (wxButton), botones con imágenes (wxBitmapButton), calendarios (wxCalendarCtrl), visualizadores HTML (wxSimpleHtmlListBox), etiquetas (wxStaticText), etc. */

wxTextCtrl *miTextCtrl;

private:

/* Como métodos privados tendremos los manejadores de los eventos asociados a las entradas de menú. */

void OnClose(wxCloseEvent& event);

void OnQuit(wxCommandEvent& event);

void OnAbout(wxCommandEvent& event);

void OnEdit(wxCommandEvent& event);

void OnOpen(wxCommandEvent& event);

void OnPreferences(wxCommandEvent& event);

DECLARE_EVENT_TABLE()

};

#endif // MIPROYECTOMAIN_H

/* El último archivo que definimos es MiProyectoMain.cpp, se trata del fichero donde se encuentra la implementación de la funcionalidad de nuestra ventana principal*/

/***************************************************************

* Name: MiProyectoMain.cpp

* Purpose: Code for Application Frame

* Author: joe (pasatelinux@gmail.com)

* Created: 2009-05-31

* Copyright: joe (http://quickandhandytips.com)

* License:

**************************************************************/

#ifdef WX_PRECOMP

#include "wx_pch.h"

#endif

#ifdef __BORLANDC__

#pragma hdrstop

#endif //__BORLANDC__

#include "MiProyectoMain.h"

/* Fíjate en los diferentes includes que tenemos que introducir para poder utilizar los diferentes componetes de wxWidgets. Por ejemplo, aboutdlg.h nos permite mostrar la ventana modal con información acerca de los autores. */

#include <wx/aboutdlg.h>

#include <wx/icon.h>

#include <wx/fontdlg.h>

#include <wx/colordlg.h>

/*El código que viene a continuación es bastante “prescindible”, sólo debes fijarte en ….*/

//helper functions

enum wxbuildinfoformat {

short_f, long_f };

wxString wxbuildinfo(wxbuildinfoformat format)

{

wxString wxbuild(wxVERSION_STRING);

if (format == long_f )

{

#if defined(__WXMSW__)

wxbuild << _T("-Windows");

#elif defined(__WXMAC__)

wxbuild << _T("-Mac");

#elif defined(__UNIX__)

wxbuild << _T("-Linux");

#endif

#if wxUSE_UNICODE

wxbuild << _T("-Unicode build");

#else

wxbuild << _T("-ANSI build");

#endif // wxUSE_UNICODE

}

return wxbuild;

}

BEGIN_EVENT_TABLE(MiProyectoFrame, wxFrame)

/* … esta línea, donde Code::Blocks (este código es suyo) indica que el método OnClose responde al evento cerrar la ventana, es decir, pulsar sobre la X de la ventana */

EVT_CLOSE(MiProyectoFrame: :OnClose)

END_EVENT_TABLE()

/* A partir de ahora definimos el constructor de nuestra ventana principal. Observa cómo realiza una llamada al constructor de la clase base wxFrame. */

MiProyectoFrame::MiProyectoFrame(wxFrame *frame, const wxString& title)

: wxFrame(frame, -1, title)

{

#if wxUSE_MENUS

// Lo primero que realizamos será crear la barra de menú.

wxMenuBar* mbar = new wxMenuBar();

/* A continuación, creamos la primera entrada de menú fileMenu, fíjate cómo tiene una cadena wxString como argumento. wxMenu representa una lista de elementos de los cuales uno podrá ser seleccionado por el usuario. */

wxMenu* fileMenu = new wxMenu(wxT(""));

/* Mediante el método Append podemos añadir un ítem al menú. Tenemos como argumentos: un identificador (p.e. wxID_OPEN), una cadena que será la que el usuario podrá visualizar al desplegar el menú fileMenu y una tercera cadena que servirá para mostrar una ayuda contextual en la barra de estado. En este caso, el identificador wxID_OPEN es una constante reservada y definirá por nosotros una entrada de menú con el típico icono y las teclas aceleradoras Ctrl, O. */

fileMenu->Append(wxID_OPEN, wxT("Abrir"), wxT("Abrir fichero"));

/* Definimos otra entrada, Salir de la misma forma */

fileMenu->Append(wxID_EXIT, wxT("Salir"), wxT("Salir de la aplicación"));

/* Agregamos el menú fileMenu a la barra de menús. */

mbar->Append(fileMenu, _("&Archivo"));

/* De modo análogo a lo anteriormente explicado definimos dos menús: editMenu y helpMenu. El primero incluirá: Editar la fuente y Color de la fuente, el segundo, el típico Acerca. */

wxMenu* editMenu = new wxMenu(_T(""));

editMenu->Append(wxID_EDIT, wxT("&Editar la fuente"), wxT("Modifica la fuente"));

editMenu->Append(wxID_PREFERENCES, wxT("Color de la fuente"), wxT("Modifica el color de la fuente"));

mbar->Append(editMenu,_("&Edita"));

wxMenu* helpMenu = new wxMenu(wxT(""));

helpMenu->Append(wxID_ABOUT, wxT("&Acerca\tF1"), wxT("Muestra informacion sobre la aplicacion"));

mbar->Append(helpMenu, wxT("&Ayuda"));

/* Un método que hereda nuestra clase MiProyectoFrame de wxFrame es SetMenuBar que indica a la ventana que muestre la barra de menú que se le pasa como parámetro.*/

SetMenuBar(mbar);

#endif // wxUSE_MENUS

#if wxUSE_STATUSBAR

/* Otro método que también heredamos de wxFrame es CreateStatusBar que crea una barra de estado (con 2 campos) en la parte inferior de la ventana. */

CreateStatusBar(2);

/* Mostramos en dicha barra de estado la cadena “Mi proyecto con Code::Blocks!” en el primer campo.*/

SetStatusText(_("Mi Proyecto con Code::Blocks!"),0);

SetStatusText(wxbuildinfo(short_f), 1);

#endif // wxUSE_STATUSBAR

/* Ahora indicamos que eventos serán atendidos y cuáles serán sus manejadores. Así por ejemplo, el identificador de wxID_EXIT, que representa el elemento de menú “Salir” tiene un evento wxEVT_COMMAND_MENU_SELECTED, es decir, elemento de menú seleccionado. Dicho evento será atendido por OnQuit. Recuerda que debes haber definido el prototipo en MiProyectoMain.h */

Connect(wxID_EXIT, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler(MiProyectoFrame::OnQuit));

Connect(wxID_OPEN, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler(MiProyectoFrame::OnOpen));

Connect(wxID_EDIT, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler(MiProyectoFrame::OnEdit));

Connect(wxID_PREFERENCES, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler(MiProyectoFrame::OnPreferences));

Connect(wxID_ABOUT, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler(MiProyectoFrame::OnAbout));

/* Para acabar el constructor de nuestra ventana principal, creamos nuestro control de texto multilínea, observa la constante wxTE_MULTILINE. Su ventana padre es nuestro marco MiProyectoFrame (this) y el -1 que le sigue indica al compilador que adopte el identificador para nuestro control por defecto. */

miTextCtrl = new wxTextCtrl(this, -1, wxT(""), wxPoint(-1, -1), wxSize(-1, -1), wxTE_MULTILINE);

}

/* En nuestro caso el destructor no realiza nada */

MiProyectoFrame::~MiProyectoFrame()

{

}

/* Este es el manejador relativo a la entrada de menú Color de la fuente */

void MiProyectoFrame::OnPreferences(wxCommandEvent &event)

{

/* Definimos un objeto de la clase wxColourData donde podremos por ejemplo indicar el color que deseamos se seleccione por defecto con SetColour. */

wxColourData datosColor;

// En nuestro caso, sólo indicaremos que permita al usuario seleccionar cualquier color

datosColor.SetChooseFull(true);

/* Creamos un objeto de la clase wxColourDialog que implementa la ventana de diálogo que permite al usuario seleccionar un color. */

wxColourDialog dialogoColor(this, &datosColor);

/* Mostramos dicha ventana y si el usuario hace clic en el botón Aceptar …*/

if (dialogoColor.ShowModal() == wxID_OK)

{

/* … recuperamos la información relativa a lo que el usuario ha seleccionado, en particular en colorSeleccionado se encuentra su color preferido. Observa que wxColour es la clase que representa a un color en wxWidgets. */

wxColourData datosRespuesta = dialogoColor.GetColourData();

wxColour colorSeleccionado = datosRespuesta.GetColour();

/* Cambiamos el color de fondo del control de texto de acorde con las preferencias del usuario. */

miTextCtrl->SetBackgroundColour(colorSeleccionado);

}

/* Si el usuario pulsa Cancelar, no hacemos nada.*/

}

/* Este es el manejador relativo a la entrada de menú Abrir */

void MiProyectoFrame::OnOpen(wxCommandEvent &event)

{

/* Observa la similitud con lo realizado previamente. Creamos un objeto wxFileDialog que representa el cuadro de diálogo que permite al usuario seleccionar un fichero.*/

wxFileDialog * dialogoAbrirFichero = new wxFileDialog(this);

/* Cambiamos el título para que muestre Abrir fichero en la barra de título. */

dialogoAbrirFichero->SetMessage(wxT("Abrir fichero"));

/* Si el usuario ha hecho clic sobre Aceptar*/

if (dialogoAbrirFichero->ShowModal() == wxID_OK){

/* … recuperamos la información del diálogo, en nuestro caso, el path o la ruta del archivo seleccionado */

wxString nombreFichero = dialogoAbrirFichero->GetPath();

/* Mostramos la información Abriendo… nombre del fichero en la barra de estado*/

SetStatusText(wxT("Abriendo..." + nombreFichero),0);

/* Abrimos el archivo y lo visualizamos en nuestro control de texto. */

miTextCtrl->LoadFile(nombreFichero);

}

}

/* Manejador de eventos creado por Code::Blocks para responder al evento cerrar ventana causado al pulsar la X, Cerrar. */

void MiProyectoFrame::OnClose(wxCloseEvent &event)

{

/* Es una llamada al método Destroy de wxWindow que destruye la ventana de forma segura. Fíjate que MiProyectoFrame hereda de wxFrame el cual a su vez hereda de wxWindow. */

Destroy();

}

/* Este es el manejador relativo a la entrada de menú Salir */

void MiProyectoFrame::OnQuit(wxCommandEvent &event)

{

Destroy();

}

/* Manejador relativo a la entrada de menú Editar la fuente. */

void MiProyectoFrame::OnEdit(wxCommandEvent &event)

{

/* Creamos un objeto wxFontDialog que es la clase encargada de los diálogos de selección de fuente. */

wxFontDialog *dialogoFuente = new wxFontDialog(this);

/* Muestra dicho cuadro de diálogo y si el usuario selecciona Aceptar… */

if (dialogoFuente->ShowModal() == wxID_OK) {

/* … modificamos la fuente de nuestro control de texto conforme a las especificaciones del usuario. */

miTextCtrl->SetFont(dialogoFuente->GetFontData().GetChosenFont());

/* Mostramos el mensaje Cambiamos la fuente, seguido de la descripción de la fuente en la barra de estado. */

SetStatusText(wxT("Cambiamos la fuente" + dialogoFuente->GetFontData().GetChosenFont().GetNativeFontInfoUserDesc()),0);

}

}

/* Manejador relativo a la entrada de menú Acerca. */

void MiProyectoFrame::OnAbout(wxCommandEvent &event)

{

/* Utilizamos la clase wxAboutDialogInfo que alberga toda la información que se mostrará en la ventana de diálogo estándar Acerca de cuándo se invoque con wxAboutBox*/

wxAboutDialogInfo my_info;

/* Con el método AddDeveloper, añadimos el nombre/nombres de los programadores que han diseñado el proyecto y que se mostrarán al hacer clic en el botón Créditos, pestaña Escrito por. */

my_info.AddDeveloper(_("Máximo Núñez y Fco. Javier Sánchez"));

/* En el caso del método AddTranslator, se trata de proporcionar el nombre de los traductores. Se visualiza con Créditos, Traducido por. */

my_info.AddTranslator(_("John Smith"));

/* Las siguientes llamadas son auto explicativas: nombre de las personas encargadas de la documentación, versión, nombre de la aplicación, descripción, Web de los autores y licencia.*/

my_info.AddDocWriter(_("Marta Jiménez"));

my_info.SetVersion(wxT("0.1"));

my_info.SetName(_("Mi Proyecto"));

my_info.SetDescription(_("Probando Code::Blocks"));

my_info.SetWebSite(wxT("http://quickandhandytips.com"));

my_info.SetLicence(_("GPL"));

/* Mostramos la ventana de diálogo con la información alojada en my_info. */

wxAboutBox(my_info);

}


30.6 Gambas o el Visual Basic libre.

30.6.1 Definición. Características.

Gambas está pensado para los desarrolladores de software que estén acostumbrados a programar en Windows con Visual Basic, la idea es que puedan dar fácilmente el salto a GNU/Linux.

Este entorno de programación destaca por su sencillez de utilización y funcionalidad, es muy aconsejable por ejemplo, para proyectos de acceso a bases de datos. Además como característica anecdótica podemos decir que el entorno de programación de gambas está escrito en el propio lenguaje Gambas. La página oficial del proyecto es http://gambas.sourceforge.net/ y tal como puedes leer en dicha dirección con Gambas puedes desde desarrollar potentes interfaces GUI con QT o GTK+, acceder a bases de datos en MySQL, PostgreSQL, ODBC y SQLite hasta crear aplicaciones de red o basadas en 3D OpenGL.


30.6.2 Instalación.

Para su instalación, precisas el paquete gambas2. Una vez instalado, se nos ubicará en la categoría de Programación.


30.6.3 Creación de un proyecto visual: un Hola Mundo contestón.

Vamos a crear una aplicación sencilla:

1. Al iniciar Gambas se nos presenta la ilustración que mostramos a continuación.

Desde aquí podemos abrir un proyecto creado previamente o crear uno nuevo, ejecutar ejemplos que nos ilustren el funcionamiento de la aplicación o salir.

Haz clic sobre Nuevo proyecto y sigue el asistente.

2. Ahora tenemos que seleccionar el tipo de proyecto que deseamos, hemos elegido una Aplicación gráfica al más puro estilo Visual Basic. Haz clic en Siguiente.

Observa que podíamos realizar también un proyecto de consola o terminal, gráfica QT o GTK+, aplicación SDL así como copiar o tomar como base un proyecto ya existente.

3. Después hemos de elegir la carpeta donde almacenaremos los ficheros del proyecto, seleccionamos la que deseemos y hacemos clic en Siguiente.

Una buena idea es realizarla en un subdirectorio de tu directorio home para no tener problemas de permisos. En el ejemplo, hemos utilizado /home/joe/Documentos.

4. Seguidamente tendremos que proporcionarle un nombre al proyecto y el título del mismo, tras rellenar estos campos pulsamos sobre el botón Siguiente.

Gambas te contestará que el proyecto se ha realizado con éxito. Por tanto, una vez completado el asistente, debemos tener nuestro proyecto o más bien un esqueleto de aplicación.

5. Ahora hemos de diseñar la interfaz. Observa en la figura adjunta en la ventana de la izquierda, haciendo clic en Formularios, FMain accedemos al formulario principal. Le daremos un nombre y dibujaremos los controles que deseemos. Fíjate en la figura adjunta de todo lo que Gambas pone a nuestra disposición. El típico menú y tres ventanas que de izquierda a derecha son: navegador del proyecto, diseño del formulario principal FMain.form y la ventana de propiedades.

La idea es diseñar primero la GUI, es decir la interfaz gráfica de usuario, personalizarla a nuestros gustos y preferencias, mediante las propiedades adecuadas y más tarde implementar la funcionalidad.

6. Cargamos la caja de herramientas desde Vista, Caja de herramientas. Hemos pues incluido en nuestro formulario lo siguiente:

* Una imagen (PictureBox), observa sus propiedades en la ventana de la derecha. Las propiedades más importante son Picture, el fichero imagen y Stretch que ajusta (si está a True) la imagen al espacio asignado en el formulario.

* Dos etiquetas (Label), de la que hemos definido las propiedades: Text, el texto que se muestra y Font, el tipo y fuente de letra; una es “Programa en Linux”, otra es “Introduce tu nombre”.

* Un cuadro de texto (TextBox) para que el usuario pueda introducir su nombre, hemos dejado vacío el campo Text.

* Un botón (Button) del que hemos modificado su propiedad Text, que ahora muestra “Botón Contestón”.

7. En este paso vamos a darle funcionalidad al botón, de suerte que cuando el usuario haga clic sobre dicho botón le muestre un mensaje. Para ello hemos de codificar el evento de pulsar el botón, haz doble clic sobre el botón y tal como muestra la ilustración inferior escribimos la siguiente instrucción: Message.Info(“Encantado de conocerte, “ & TextBox1.Text, “Salir”). Observa que hemos concatenado (unido) con el operador & dos cadenas de caracteres, una es “Encantado de conocerte” y otra es la cadena que capturamos del control TextBox1, a través de su propiedad Text.

Considera que Gambas nos ha escrito la cabecera o prototipo y el final de la función: PUBLIC SUB Button1_Click() y END con lo que aumentamos la productividad y nos permite centrarnos en lo que realmente nos interesa.

8. Pues ya tenemos el programa realizado, para probarlo haz clic sobre el botón Ejecutar y verás el resultado obtenido.

9. Sin embargo, para salir tendrás que hacerlo pulsando la X. Vamos a añadir un temporizador que a los dos segundos cierre la aplicación.

Añade la herramienta Timer (temporizador) situada en la categoría Special (especial). Cambia su propiedad Delay a 2000 (retraso a 2 segundos) y Enabled a True (habilitado). Haz doble clic en el temporizador y en el cuerpo del método Timer1_Timer() escribe QUIT para salir de la aplicación a los dos segundos.


30.7 MonoDevelop.

Mono es un proyecto que intenta conseguir que “los desarrolladores sean felices y productivos” (véase su página Web, http://mono-project.com/Main_Page). Más concretamente, se trata de una versión libre y open source, es decir, de código abierto de la plataforma .NET. Entre sus características se encuentran las siguientes:

* Integra herramientas multiplataforma que corren en Linux y Windows.

* Se trata de un proyecto multilenguaje, es decir, permite desarrollar no sólo C# 3.0, sino también VB 8, Java, Python, etc.

* Es compatible con las API de Microsoft, a saber: ASP.NET, ADO.NET y Windows Form 2.0.


30.7.1 Instalación de MonoDevelop.

La instalación de Mono no requiere de muchos conocimientos. Siguiendo las instrucciones de http://www.howtogeek.com/howto/ubuntu/install-monodevelop-on-ubuntu-linux/, instalaremos los paquetes: monodevelop, mono-2.0-devel, mono-gmcs (compilador Mono C# 2.0 y C# 3.0), mono-gac, mono-utils (utilidades y herramientas de Mono), monodoc, monodoc-browser (documentación), monodevelop-nuit y monodevelop-java (plugins de NUnit y Java respectivamente) y monodevelop-versioncontrol (para control de versiones –subversion-).


30.7.2. Windows Forms en Linux.

Lanza el programa desde Aplicaciones, Programación, MonoDevelop. Selecciona Archivo, Nueva, Solución.

Indica el tipo de proyecto deseado, en este primer ejemplo un Proyecto de consola, un nombre para el proyecto y otro para la solución, así como una ubicación. Haz clic en Adelante.

Los proyectos se organizan en soluciones, cada solución se almacena en un directorio y por tanto, los proyectos son subdirectorios de la carpeta de la solución.

En la siguiente ventana te indicará si quieres soporte para empaquetado, traducción, GTK# o integración con Unix. No selecciones ninguna opción de momento, sólo haz clic en Aceptar.

Observa el esqueleto de aplicación que nos ha creado Mono. Navega por Ejecutar, Ejecutar y observa la salida en el panel inferior en la ventana titulada Traza de la aplicación.

La línea Console.WriteLine(“Hola MonoDevelop!”) debes leerla como una llamada al método WriteLine (escribir una línea) de la clase Console definida en el espacio de nombres System.

Para realizar programas utilizando Windows Forms en Linux instala el paquete libmono-winforms2.0-cil que es la librería System.Windows.Forms.

En el panel lateral izquierdo, explorador de soluciones, haz clic en Referencias y selecciona en el menú contextual Editar Referencias…

Tal como se aprecia en la figura selecciona System.Windows.Form.

A continuación, haremos uso de las Windows Forms que se encuentran en System.Windows.Forms (observa el using en la línea 2).

Crearemos un cuadro de mensaje utilizando la llamada al método Show de la clase MessageBox, más concretamente es un método de clase, es decir, estático, la llamada se hace al nombre de la clase no a un objeto o instancia de la misma.

El código es: MessageBox.Show("Hola MonoDevelop", "Mi cuadro de mensaje", MessageBoxButtons.OK, MessageBoxIcon.Information); Los cuatro argumentos indican: mensaje, título de la ventana, botones (en el ejemplo sólo OK) e icono.

Fíjate como MonoDevelop nos muestra los métodos y constantes a nuestra disposición. Esta ayuda contextual es valiosísima e incrementa nuestra productividad notablemente.

Finalicemos, realizamos un formulario en Windows Form. Observa que tiene un título, un texto y una línea.

Lo primero que te llamará la atención es que el formulario se debe pasar a Application.Run como argumento, es decir: Application.Run(miForm) Cuando se cierre el formulario, se devolverá el control a Main que podrá acabar de la forma más adecuada.

Considera que si programas en Linux existen otras alternativas mejores a Windows Forms, léase GTK.

Otro detalle que quizás conviene resaltar es que hemos asociado un manejador al evento Paint, que se produce cada vez que se dibuja el formulario, más concretamente HandlePaint. Este controlador de eventos tiene dos argumentos asociados:

* object: el objeto sobre el que se aplica el evento, en nuestro caso el formulario, de hecho podríamos recuperarlo en el manejador del evento Paint realizando un casting de la siguiente forma: Form miFormulario = (Form) object;

* e, cuya principal característica reside en la propiedad Graphics. Se trata del objeto que nos permite dibujar gráficos y textos en el formulario.

using System;

using System.Windows.Forms;

using System.Drawing;

namespace HolaMonoDevelop

{

class MainClass

{

public static void Main()

{

//Creamos un objeto formulario

Form miForm = new Form();

//Cambiamos la propiedad text, para que se muestre un título personalizado

miForm.Text = "Mi Windows Forms en Ubuntu";

miForm.Cursor = Cursors.Arrow;

//Añadimos el manejador del evento Paint.

miForm.Paint += HandlePaint;

Application.Run(miForm);

}

static void HandlePaint(object sender, PaintEventArgs e)

{

/*Concatenamos a “Hola Mono“ un bienvenido al usuario del sistema, el cual lo hemos recuperado llamando al método UserName de la clase SystemInformation, información del sistema. */

String cadena = "Hola Mono. Bienvenido " + SystemInformation.UserName;

/* Dibujamos una cadena y una línea, con sendas llamadas al objeto Graphics: DrawString y DrawLine */

e.Graphics.DrawString(cadena, new Font("Times New Roman", 16, FontStyle.Bold), Brushes.Black, 10,0);

e.Graphics.DrawLine(new Pen(Brushes.Red), 10, 30, 270, 30);

}

}

}

En DrawString tenemos como argumentos:

* String, la cadena que se mostrará en el formulario.

* Una fuente construida con el constructor con tres argumentos: nombre de la fuente, tamaño y estilo, en el ejemplo, negrita.

* Un pincel que se obtiene utilizando el método estático Black de la clase Brushes.

* Coordenadas x, y donde se dibujará el texto.

En DrawLine en cambio tenemos como argumento un lápiz que se construye con el constructor con un pincel de color rojo como argumento y las coordenadas de origen y destino de la línea.


30.8. Programando en Java con Eclipse.

30.8.1. Definición. Características. Direcciones interesantes.

Para los amantes de java, Eclipse es una buena opción, su página Web oficial es www.eclipse.org. Se trata de una aplicación de código abierto y multiplataforma, elaborada por IBM. Un entorno de desarrollo profesional para aplicaciones desarrolladas bajo este lenguaje.


30.8.2. Instalación.

La instalación en GNU/Linux consiste en instalar los paquetes eclipse y eclipse-nls (este segundo paquete incluye la extensión del idioma) y lo encontrarás en Aplicaciones, Programación, Eclipse. Al principio de la configuración te preguntará donde crear el Espacio de trabajo, por defecto será: /home/joe/workspace/.


30.8.3. Creación de proyectos con Eclipse.

Observa en la ilustración la pantalla de bienvenida, tienes acceso a tutoriales, ejemplos, etc.

Crea un nuevo proyecto: Archivo, Nuevo, Proyecto. Selecciona dentro de Java, Proyecto Java. Haz clic en Siguiente.

Ahora dale un nombre al proyecto, por ejemplo HolaMundoLibre.

Puedes elegir si deseas crear el proyecto en tu entorno o área de trabajo o crearlo a partir de uno ya existente, la versión del entorno de ejecución de java, etc.

Por lo general, basta con dejar todas las opciones en sus valores por defecto. Haz clic en Finalizar.

Creamos una nueva clase de java con Archivo, Nueva, Clase.

Fíjate que hemos definido un paquete seLibre (los paquetes deben empezar en minúsculas), un nombre para la clase principal (SeLibre) que hereda de una clase padre (en Java existe un único árbol de herencia cuya raíz es la clase Object) y que nos cree el prototipo del método main.

Cuando hagas clic en Finalizar tendrás un esqueleto de proyecto con código ya escrito para aumentar tu productividad.

En Java todo son clases (Java es un lenguaje orientado a objetos puro) y se almacenan en archivos con la extensión .java, cuando éstos se compilan obtienes los ficheros .class.

Ahora procederemos a escribir el código necesario para ejecutar el programa más simple, el típico “Hola Mundo Libre”.

Fíjate en primer lugar en la parte izquierda de Eclipse. Tenemos el área de trabajo HolaMundoLibre, un paquete seLibre con una clase SeLibre en el fichero SeLibre.java.

El propio entorno de desarrollo simplifica la escritura de código mostrándote los métodos y clases a tu disposición, así como una explicación de los mismos. Escribe en el cuerpo del método main: System.out.println(“Hola Mundo Libre”) y guarda el proyecto: Archivo, Guardar o CTRL + S. Lanza el programa en Ejecutar, Ejecutar, Aplicación Java y observa el resultado en la consola en la parte inferior central de la figura.

Si queremos extender la funcionalidad precisamos añadir nuevas clases como se ha hecho en ejemplos previos; así con Archivo, Nuevo, Clase crearíamos la clase Complejo, escribe el siguiente código:

package seLibre;

public class Complejo {

int real;

int imaginario;

Complejo (int a, int b)

{

real = a;

imaginario = b;

}

public static Complejo suma(Complejo a, Complejo b)

{

Complejo resultado = new Complejo(a.real+b.real, a.imaginario+b.imaginario);

return resultado;

}

public static Complejo producto(Complejo a, Complejo b){

Complejo resultado = new Complejo(a.real*b.real-a.imaginario*b.imaginario, a.real*b.imaginario+a.imaginario*b.real);

return resultado;

}

[…]

public String toString()

{

return real + " + " + imaginario + " i";

}

}

Ahora desde la función main, podremos utilizar la nueva clase, al encontrarse en el mismo paquete (no precisamos importarla):


public static void main(String[] args) {

Complejo a = new Complejo(2,2);

Complejo b = new Complejo(2,4);

Complejo c = Complejo.suma(a, b);

System.out.print(c.toString());

}


30.9. Y mucho más: Python, GNU Prolog, etc.

30.9.1. Prolog libre: GNU Prolog y SWI-Prolog.

GNU Prolog es un compilador libre de Prolog. Su página Web es http://www.gprolog.org/. Si eres usuario de Ubuntu, basta con instalar los paquetes gprolog y gprolog-doc, conteniendo este último la documentación.

SWI-Prolog es otro compilador bajo licencia LGPL, cuya página oficial es http://www.swi-prolog.org/.En Ubuntu instala los paquetes swi-prolog y swi-prolog-doc para la documentación.

En GNU/Linux escribe en la consola gprolog o swipl respectivamente.

Vamos a realizar un programa con SWI-Prolog, sigue los siguientes pasos:

1. Con un editor de textos, crea el fichero familia.pl en la carpeta personal.

    2. La familia se compone de hechos, como por ejemplo que maximo es el padre de martanunez, padre(maximo,martanunez) y predicados como por ejemplo hermano(A, B). A es hermano de B si tienen el mismo padre (padre(Padre, A), padre(Padre,B)), la misma madre (madre(Madre, A), madre(Madre, B)), A es varón (sexo(A, varon)) y no son la misma persona (A\= = B).

    3. Escribimos en la consola gprolog y cagamos nuestro fichero Prolog con consult(nombreFicheroProlog).

    4. Ahora ya podemos realizar las consultas, por ejemplo, “dime quienes son hermanos”: hemano(A,B). A cada respuesta debemos responder con un punto y coma “;” para que siga buscando. Cuando ya ha acabado de procesar todas las posibles respuestas, responde con un No.

    Variantes de este ejemplo clásico y otros muchos puedes encontrar en castellano en la entrada wiki de Prolog: http://es.wikipedia.org/wiki/Prolog y en el portal “Programación en castellano” en su tutorial de Prolog http://www.programacion.com/tutoriales/prolog/.


    30.9.2. Lisp, un respeto a los mayores: CLisp, GCL.

    Lisp es un lenguaje declarativo con bastantes años. Hay dos compiladores libres:

    * CLisp: En http://clisp.cons.org/ encontrarás una implementación de Lisp de alto nivel, propósito general y orientado a objetos para la programación funcional. En GNU/Linux basta con instalar el paquete clisp.

    * GCL: En http://www.gnu.org/software/gcl/gcl.html encontrarás una versión de GNU Common Lisp para GNU/Linux, de todas formas lo encontrarás más fácil instalando el paquete gcl y sus dependencias. Se ejecutan desde la consola escribiendo clisp y gcl respectivamente.

    Observa que hemos sumado tres números, definido con defun la función factorial, calculado el factorial de siete y realizado varias operaciones con listas.


    30.9.3. Lazarus, el Delphi más libre.

    Lazarus es un IDE que pretende ser una clon de Delphi, pero bajo licencia GPL, bueno más bien una versión de GPL. El lugar obligado de peregrinaje debe ser su Wiki http://wiki.lazarus.freepascal.org/index.php/Lazarus_Documentation, donde obtendrás abundante información así como tutoriales tanto para usuarios novatos como expertos.

    Para instalarlo en Ubuntu basta con teclear en la consola: sudo apt-get install lazarus y se lanza desde Aplicaciones, Programación, Lazarus. ¿Podría ser más fácil?


    30.9.4. También hay lenguajes de moda “open source”: Python.

    Python es otro lenguaje muy de moda, en GNU/Linux no tienes ni que instalarlo basta con invocarlo escribiendo python en la consola. Su página oficial es http://www.python.org/.

    Es un lenguaje orientado a objetos que ofrece según la Web oficial una gran integración con otros lenguajes de programación y herramientas de desarrollo.

    Observa el ejemplo que te mostramos en la ilustración, calculamos el factorial de 7 y mostramos un mensaje; ¿fácil?

    Para desarrollar interfaces gráficas de usuario Python cuenta con dos soluciones principales: PyGTK y wxPython. Buenos manuales de ambas opciones los puedes encontrar en: http://www.pygtk.org/pygtk2tutorial-es/index.html y http://zetcode.com/wxpython/ respectivamente.

    Precisamos instalar el paquete python-wxgtk2.8, luego creamos el fichero miPrimerWxgtk.py


    #!/usr/bin/python

    import wx

    # Importamos los módulos wxPython

    miApp = wx.App()

    #Todo programa en wxPython precisa tener de un objeto aplicación, además creamos un objeto Frame, que será nuestro formulario principal. El contructor indica que se trata del Widget raíz, es decir, no tiene padres (None), con -1 indicamos a Python que le asigne un identificador y finalmente el tercer parámetro será el título de nuestra ventana.

    miFrame = wx.Frame(None, -1, 'Hola WxPython')

    # Con el método Show solicitamos que se muestre nuestra ventana

    miFrame.Show()

    # Invocamos al método MainLoop de nuestro objeto aplicación para entrar en el típico bucle sin fin de cualquier aplicación de ventanas en un entorno GUI donde se dispararán eventos y habrá manejadores asignados para darles respuesta.

    miApp.MainLoop()

    El resultado no es muy espectacular, pero tenemos una ventana solvente con los típicos botones de minimizar, maximizar y cerrar:


    30.9.5. Programación funcional con Haskell.

    Haskell es un lenguaje de programación funcional puro, es decir, cuando programamos en Haskell buscamos un código formado por un conjunto de funciones que no padecen de “efectos laterales”. Además, presenta la propiedad de la transparencia referencial, es decir, la evaluación de una expresión puede cambiar su forma pero no su valor.

    En Linux podemos instalar diversas versiones de Haskell: ghc, nhc98 y hugs. Sin embargo, una de las implementaciones más famosas es la de Glasgow, GHC (Glasgow Haskell Compiler). En Ubuntu basta con instalar el paquete ghc6 y si deseas también la documentación el paquete ghc6-doc.

    Para ejecutarlo escribe en la consola ghci y observa que hemos definido la función menorLista que devuelve el elemento más pequeño de la lista pasada como argumento. Dicha función consta de un caso base, la lista contiene un solo elemento (el menor de una lista con un solo elemento, es obviamente dicho elemento) y un caso recursivo. En este último caso, el menor de una lista será el mínimo del primer elemento de la lista y el menor de la lista resultante de extraer el primer elemento de la lista original.